package luke.core.logging;

import luke.core.config.AppDataManager;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 静态日志工具类
 * 用于避免循环依赖问题，提供简单的日志记录功能
 */
public class LogUtil {
    
    private static final String LOG_FILE_NAME = "RunBeats_Debug.log";
    private static SimpleDateFormat timestampFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    
    // 用于避免循环依赖的标志
    private static final ThreadLocal<Boolean> initializing = new ThreadLocal<Boolean>() {
        @Override
        protected Boolean initialValue() {
            return false;
        }
    };
    
    // 日志级别枚举
    public enum LogLevel {
        DEBUG("DEBUG"),
        INFO("INFO"),
        WARN("WARN"),
        ERROR("ERROR");
        
        private final String level;
        
        LogLevel(String level) {
            this.level = level;
        }
        
        @Override
        public String toString() {
            return level;
        }
    }
    
    /**
     * DEBUG级别日志
     */
    public static void debug(String module, String operation, String details) {
        log(LogLevel.DEBUG, module, operation, details);
    }
    
    /**
     * INFO级别日志
     */
    public static void info(String module, String operation, String details) {
        log(LogLevel.INFO, module, operation, details);
    }
    
    /**
     * WARN级别日志
     */
    public static void warn(String module, String operation, String details) {
        log(LogLevel.WARN, module, operation, details);
    }
    
    /**
     * ERROR级别日志
     */
    public static void error(String module, String operation, String details) {
        log(LogLevel.ERROR, module, operation, details);
    }
    
    /**
     * 写入日志
     * @param level 日志级别
     * @param module 模块名称
     * @param operation 操作名称
     * @param details 详细信息
     */
    private static synchronized void log(LogLevel level, String module, String operation, String details) {
        try {
            // 检查是否正在初始化AppDataManager，避免循环依赖
            if (initializing.get()) {
                // 直接输出到控制台，避免使用文件日志
                String timestamp = timestampFormat.format(new Date());
                String logEntry = String.format("[%s] [%s] [%s] [%s] %s", 
                        timestamp, level, module, operation, details);
                System.out.println(logEntry);
                return;
            }
            
            // 获取日志文件路径
            Path logPath = getLogPath();
            
            // 格式化日志条目
            String timestamp = timestampFormat.format(new Date());
            String logEntry = String.format("[%s] [%s] [%s] [%s] %s%n", 
                    timestamp, level, module, operation, details);
            
            // 同时打印到控制台
            System.out.print(logEntry);
            
            // 写入日志文件
            Files.write(logPath, logEntry.getBytes(), 
                    Files.exists(logPath) ? 
                            StandardOpenOption.APPEND : 
                            StandardOpenOption.CREATE);
                            
        } catch (Exception e) {
            // 日志写入失败时输出到控制台，避免无限递归
            String errorMessage = "日志写入失败: " + e.getMessage();
            System.err.println(errorMessage);
            e.printStackTrace();
        }
    }
    
    /**
     * 获取日志文件路径
     * @return 日志文件路径
     */
    private static Path getLogPath() {
        // 设置初始化标志，避免循环依赖
        initializing.set(true);
        try {
            // 直接通过AppDataManager获取日志目录，避免循环依赖
            AppDataManager appDataManager = AppDataManager.getInstance();
            return appDataManager.getLogsDirectory().resolve(LOG_FILE_NAME);
        } finally {
            // 清除初始化标志
            initializing.set(false);
        }
    }
    
    /**
     * 获取日志文件名
     * @return 日志文件名
     */
    public static String getLogFileName() {
        return LOG_FILE_NAME;
    }
}